//package com.pan.common.util;
//
//import com.google.common.collect.Lists;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.data.redis.core.script.DefaultRedisScript;
//import org.springframework.data.redis.core.script.RedisScript;
//import org.springframework.util.CollectionUtils;
//
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
///**
// * REDIS 工具类
// *
// * @author zhengmingyue 2018年9月28日-上午11:14:06
// * @description
// */
//@Slf4j
//public final class RedisUtil {
//
//
//    private RedisTemplate redisTemplate;
//
//    public void clearRedisCache(boolean boolea) {
//        String keys = boolea ? "wisdomVersion*" : "wisdomVersion_channel*";
//        long deletedCount = batchDeleteRedisKeys(keys);
//        log.info("成功删除KEY：{}，删除符合条件的记录数{}个。", keys, deletedCount);
//    }
//
//    /**
//     * 批量删除Redis的KEY
//     *
//     * @param keyPattern 要删除的KEY的模式
//     * @return 被删除的KEY的数量
//     */
//    public long batchDeleteRedisKeys(String keyPattern) {
//        StringBuilder luaScript = new StringBuilder();
//        luaScript.append("-- 游标的id\n");
//        luaScript.append("local cursor = 0\n");
//        luaScript.append("-- 查找删除的key的数量\n");
//        luaScript.append("local keyNum = 0\n");
//        luaScript.append("repeat\n");
//        luaScript.append("    -- 使用SCAN搜索，cursor=0的时候标识一个新的迭代期，服务器返回0的时候表示迭代已经结束\n");
//        luaScript.append("    local res = redis.call(\"SCAN\", cursor, \"MATCH\", KEYS[1])\n");
//        luaScript.append("    if (res ~= nil and #res >= 0) then\n");
//        luaScript.append("        cursor = tonumber(res[1])\n");
//        luaScript.append("        local ks = res[2]\n");
//        luaScript.append("        if (ks ~= nil and #ks > 0) then\n");
//        luaScript.append("            redis.replicate_commands()\n");
//        luaScript.append("            -- 循环删除当前迭代器迭代出的数据\n");
//        luaScript.append("            for i = 1, #ks, 1 do\n");
//        luaScript.append("                local key = tostring(ks[i])\n");
//        luaScript.append("                -- 使用UNLINK删除，区别于DEL的是这个是异步执行的\n");
//        luaScript.append("                -- 这条指令要版本大于4.0.0，小于4.0.0就使用DEL\n");
//        luaScript.append("                redis.call(\"DEL\", key)\n");
//        luaScript.append("            end\n");
//        luaScript.append("            -- 统计删除的key的数量\n");
//        luaScript.append("            keyNum = keyNum + #ks\n");
//        luaScript.append("        end\n");
//        luaScript.append("    end\n");
//        luaScript.append("-- 当服务器返回0的时候，跳出循环\n");
//        luaScript.append("until (cursor <= 0)\n");
//        luaScript.append("return keyNum\n");
//
//        List<String> keys = Lists.newArrayList(keyPattern);
//        RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript.toString(), Long.class);
//        Long keyNum = (Long)redisTemplate.execute(redisScript, keys);
//        return (keyNum == null) ? 0 : keyNum;
//    }
//
//    /**
//     * 指定缓存失效时间
//     *
//     * @param key
//     * @param time
//     * @return
//     */
//    public boolean expire(String key, long time) {
//        try {
//            if (time > 0) {
//                redisTemplate.expire(key, time, TimeUnit.SECONDS);
//            }
//            return true;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    /**
//     * 根据key 获取过期时间
//     *
//     * @param key 键 不能为null
//     * @return 时间(秒) 返回0代表为永久有效
//     */
//    public long getExpire(String key) {
//        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
//    }
//
//    /**
//     * 判断key是否存在
//     *
//     * @param key
//     * @return true 存在 false不存在
//     */
//    public boolean hasKey(String key) {
//        try {
//            return redisTemplate.hasKey(key);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    /**
//     * 判断key是否存在
//     * S tring hashKey
//     *
//     * @param key
//     * @return true 存在 false不存在
//     */
//    public boolean hashKey(String key, String hashKey) {
//        try {
//            return redisTemplate.opsForHash().hasKey(key, hashKey);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    /**
//     * 删除缓存
//     *
//     * @param key 可以传一个值 或多个
//     */
//
//    @SuppressWarnings("unchecked")
//    public void del(String... key) {
//        if (key != null && key.length > 0) {
//            if (key.length == 1) {
//                redisTemplate.delete(key[0]);
//            } else {
//                redisTemplate.delete(CollectionUtils.arrayToList(key));
//            }
//        }
//    }
//
//
//    /**
//     * 递增
//     *
//     * @param key
//     * @param delta 要增加几(大于0)
//     * @return
//     */
//    public long incr(String key, long delta) {
//        if (delta < 0) {
//            throw new RuntimeException("递增因子必须大于0");
//        }
//        return redisTemplate.opsForValue().increment(key, delta);
//    }
//
//    /**
//     * 递减
//     *
//     * @param key
//     * @param delta 要减少几(小于0)
//     * @return
//     */
//    public long decr(String key, long delta) {
//        if (delta < 0) {
//            throw new RuntimeException("递减因子必须大于0");
//        }
//        return redisTemplate.opsForValue().increment(key, -delta);
//    }
//
//    /**
//     * HashGet
//     *
//     * @param key 键 不能为null
//     * @param item 项 不能为null
//     * @return 值
//     */
//    public Object hget(String key, String item) {
//
//        return redisTemplate.opsForHash().get(key, item);
//    }
//
//    /**
//     * 获取hashKey对应的所有键值
//     *
//     * @param key 键
//     * @return 对应的多个键值
//     */
//    public Map<Object, Object> hmget(String key) {
//
//        return redisTemplate.opsForHash().entries(key);
//    }
//
//
//    /**
//     * 判断hash表中是否有该项的值
//     *
//     * @param key 键 不能为null
//     * @param item 项 不能为null
//     * @return true 存在 false不存在
//     */
//    public boolean hHasKey(String key, String item) {
//        return redisTemplate.opsForHash().hasKey(key, item);
//    }
//
//    /**
//     * hash递增 如果不存在,就会创建一个 并把新增后的值返回
//     *
//     * @param key 键
//     * @param item 项
//     * @param by 要增加几(大于0)
//     * @return
//     */
//    public double hincr(String key, String item, double by) {
//        return redisTemplate.opsForHash().increment(key, item, by);
//    }
//
//    /**
//     * hash递减
//     *
//     * @param key 键
//     * @param item 项
//     * @param by 要减少记(小于0)
//     * @return
//     */
//    public double hdecr(String key, String item, double by) {
//        return redisTemplate.opsForHash().increment(key, item, -by);
//    }
//
//    /**
//     * 获取set缓存的长度
//     *
//     * @param key 键
//     * @return
//     */
//    public long sGetSetSize(String key) {
//        try {
//            return redisTemplate.opsForSet().size(key);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0;
//        }
//    }
//
//
//
//
//    /**
//     * 获取list缓存的长度
//     *
//     * @param key 键
//     * @return
//     */
//    public long lGetListSize(String key) {
//        try {
//            return redisTemplate.opsForList().size(key);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return 0;
//        }
//    }
//
//}
